home *** CD-ROM | disk | FTP | other *** search
- # Source Generated with Decompyle++
- # File: in.pyc (Python 2.6)
-
- import os
- import os.path as os
- import gzip
- import re
- import time
- import urllib
- import tempfile
- import glob
- from base.g import *
- from base import utils, models
- INVALID_PRINTER_NAME_CHARS = '~`!@#$%^&*()=+[]{}()\\/,.<>?\'";:| '
-
- try:
- current_language = os.getenv('LANG')
- newlang = 'C'
- if current_language is not None and current_language.count('.'):
- (newlang, encoding) = current_language.split('.')
- newlang += '.UTF-8'
-
- os.environ['LANG'] = newlang
- current_ctype = os.getenv('LC_CTYPE')
- newctype = 'C'
- if current_ctype is not None and current_ctype.count('.'):
- (newctype, encoding) = current_ctype.split('.')
- newctype += '.UTF-8'
-
- os.environ['LC_CTYPE'] = newctype
- import cupsext
- if current_ctype is not None:
- os.environ['LC_CTYPE'] = current_ctype
-
- if current_language is not None:
- os.environ['LANG'] = current_language
- except ImportError:
- if not os.getenv('HPLIP_BUILD'):
- log.warn('CUPSEXT could not be loaded. Please check HPLIP installation.')
- sys.exit(1)
-
- except:
- os.getenv('HPLIP_BUILD')
-
- IPP_PRINTER_STATE_IDLE = 3
- IPP_PRINTER_STATE_PROCESSING = 4
- IPP_PRINTER_STATE_STOPPED = 5
- PPD_UI_BOOLEAN = 0
- PPD_UI_PICKONE = 1
- PPD_UI_PICKMANY = 2
- UI_SPINNER = 100
- UI_UNITS_SPINNER = 101
- UI_BANNER_JOB_SHEETS = 102
- UI_PAGE_RANGE = 103
- UI_JOB_STORAGE_MODE = 104
- UI_JOB_STORAGE_PIN = 105
- UI_JOB_STORAGE_USERNAME = 106
- UI_JOB_STORAGE_ID = 107
- UI_JOB_STORAGE_ID_EXISTS = 108
- IPP_PAUSE_PRINTER = 16
- IPP_RESUME_PRINTER = 17
- IPP_PURGE_JOBS = 18
- CUPS_GET_DEFAULT = 16385
- CUPS_GET_PRINTERS = 16386
- CUPS_ADD_MODIFY_PRINTER = 16387
- CUPS_DELETE_PRINTER = 16388
- CUPS_GET_CLASSES = 16389
- CUPS_ADD_MODIFY_CLASS = 16390
- CUPS_DELETE_CLASS = 16391
- CUPS_ACCEPT_JOBS = 16392
- CUPS_REJECT_JOBS = 16393
- CUPS_SET_DEFAULT = 16394
- CUPS_GET_DEVICES = 16395
- CUPS_GET_PPDS = 16396
- CUPS_MOVE_JOB = 16397
- CUPS_AUTHENTICATE_JOB = 16398
- IPP_JOB_PENDING = 3
- IPP_JOB_HELD = 4
- IPP_JOB_PROCESSING = 5
- IPP_JOB_STOPPED = 6
- IPP_JOB_CANCELLED = 7
- IPP_JOB_ABORTED = 8
- IPP_JOB_COMPLETED = 8
- IPP_OK = 0
- IPP_OK_SUBST = 1
- IPP_OK_CONFLICT = 2
- IPP_OK_IGNORED_SUBSCRIPTIONS = 3
- IPP_OK_IGNORED_NOTIFICATIONS = 4
- IPP_OK_TOO_MANY_EVENTS = 5
- IPP_OK_BUT_CANCEL_SUBSCRIPTION = 6
- IPP_OK_EVENTS_COMPLETE = 7
- IPP_REDIRECTION_OTHER_SITE = 768
- IPP_BAD_REQUEST = 1024
- IPP_FORBIDDEN = 1025
- IPP_NOT_AUTHENTICATED = 1026
- IPP_NOT_AUTHORIZED = 1027
- IPP_NOT_POSSIBLE = 1028
- IPP_TIMEOUT = 1029
- IPP_NOT_FOUND = 1030
- IPP_GONE = 1031
- IPP_REQUEST_ENTITY = 1032
- IPP_REQUEST_VALUE = 1033
- IPP_DOCUMENT_FORMAT = 1034
- IPP_ATTRIBUTES = 1035
- IPP_URI_SCHEME = 1036
- IPP_CHARSET = 1037
- IPP_CONFLICT = 1038
- IPP_COMPRESSION_NOT_SUPPORTED = 1039
- IPP_COMPRESSION_ERROR = 1040
- IPP_DOCUMENT_FORMAT_ERROR = 1041
- IPP_DOCUMENT_ACCESS_ERROR = 1042
- IPP_ATTRIBUTES_NOT_SETTABLE = 1043
- IPP_IGNORED_ALL_SUBSCRIPTIONS = 1044
- IPP_TOO_MANY_SUBSCRIPTIONS = 1045
- IPP_IGNORED_ALL_NOTIFICATIONS = 1046
- IPP_PRINT_SUPPORT_FILE_NOT_FOUND = 1047
- IPP_INTERNAL_ERROR = 1280
- IPP_OPERATION_NOT_SUPPORTED = 1281
- IPP_SERVICE_UNAVAILABLE = 1282
- IPP_VERSION_NOT_SUPPORTED = 1283
- IPP_DEVICE_ERROR = 1284
- IPP_TEMPORARY_ERROR = 1285
- IPP_NOT_ACCEPTING = 1286
- IPP_PRINTER_BUSY = 1287
- IPP_ERROR_JOB_CANCELLED = 1288
- IPP_MULTIPLE_JOBS_NOT_SUPPORTED = 1289
- IPP_PRINTER_IS_DEACTIVATED = 1290
- CUPS_ERROR_BAD_NAME = 3840
- CUPS_ERROR_BAD_PARAMETERS = 3841
- nickname_pat = re.compile('\\*NickName:\\s*\\"(.*)"', re.MULTILINE)
- pat_cups_error_log = re.compile('^loglevel\\s?(debug|debug2|warn|info|error|none)', re.I)
- ppd_pat = re.compile('.*hp-(.*?)(-.*)*\\.ppd.*', re.I)
-
- def getPPDPath(addtional_paths = None):
- '''
- Returns the CUPS ppd path (not the foomatic one under /usr/share/ppd).
- Usually this is /usr/share/cups/model.
- '''
- if addtional_paths is None:
- addtional_paths = []
-
- search_paths = prop.ppd_search_path.split(';') + addtional_paths
- for path in search_paths:
- ppd_path = os.path.join(path, 'cups/model')
- if os.path.exists(ppd_path):
- return ppd_path
-
-
-
- def getAllowableMIMETypes():
- '''
- Scan all /etc/cups/*.convs files for allowable file formats.
- '''
- files = glob.glob('/etc/cups/*.convs')
- allowable_mime_types = []
- for f in files:
- conv_file = file(f, 'r')
- for line in conv_file:
- if not line.startswith('#') and len(line) > 1:
-
- try:
- (source, dest, cost, prog) = line.split()
- except ValueError:
- continue
-
- if source not in ('application/octet-stream', 'application/vnd.cups-postscript'):
- allowable_mime_types.append(source)
-
- source not in ('application/octet-stream', 'application/vnd.cups-postscript')
-
-
- allowable_mime_types.append('image/x-bmp')
- allowable_mime_types.append('text/cpp')
- allowable_mime_types.append('application/x-python')
- allowable_mime_types.append('application/hplip-fax')
- return allowable_mime_types
-
-
- def getPPDDescription(f):
- if f.endswith('.gz'):
- nickname = gzip.GzipFile(f, 'r').read(4096)
- else:
- nickname = file(f, 'r').read(4096)
-
- try:
- desc = nickname_pat.search(nickname).group(1)
- except AttributeError:
- desc = ''
-
- return desc
-
-
- def getSystemPPDs():
- (major, minor, patch) = getVersionTuple()
- ppds = { }
- if major == 1 and minor < 2:
- ppd_dir = sys_conf.get('dirs', 'ppd')
- log.debug('(CUPS 1.1.x) Searching for PPDs in: %s' % ppd_dir)
- for f in utils.walkFiles(ppd_dir, pattern = 'HP*ppd*;hp*ppd*', abs_paths = True):
- desc = getPPDDescription(f)
- if not 'foo2' in desc and 'gutenprint' in desc.lower() or 'gutenprint' in f:
- ppds[f] = desc
- log.debug('%s: %s' % (f, desc))
- continue
-
- else:
- log.debug('(CUPS 1.2.x) Getting list of PPDs using CUPS_GET_PPDS...')
- ppd_dict = cupsext.getPPDList()
- cups_ppd_path = getPPDPath()
- foomatic_ppd_path = sys_conf.get('dirs', 'ppdbase', '/usr/share/ppd')
- if not foomatic_ppd_path or not os.path.exists(foomatic_ppd_path):
- foomatic_ppd_path = '/usr/share/ppd'
-
- log.debug('CUPS PPD base path = %s' % cups_ppd_path)
- log.debug('Foomatic PPD base path = %s' % foomatic_ppd_path)
- for ppd in ppd_dict:
- if not ppd:
- continue
-
- if ('hp-' in ppd.lower() or 'hp_' in ppd.lower()) and ppd_dict[ppd]['ppd-make'] == 'HP':
- desc = ppd_dict[ppd]['ppd-make-and-model']
- if not 'foo2' in desc.lower() and 'gutenprint' in desc.lower() or 'gutenprint' in ppd:
- if os.path.exists(ppd):
- path = ppd
- else:
-
- try:
- path = os.path.join(foomatic_ppd_path, ppd)
- except AttributeError:
- path = ppd
-
- if not os.path.exists(path):
-
- try:
- path = os.path.join(cups_ppd_path, ppd)
- except AttributeError:
- path = ppd
-
- if not os.path.exists(path):
- path = ppd
-
-
- ppds[path] = desc
-
- 'gutenprint' in ppd
-
- return ppds
-
-
- def levenshtein_distance(a, b):
- '''
- Calculates the Levenshtein distance between a and b.
- Written by Magnus Lie Hetland.
- '''
- n = len(a)
- m = len(b)
- if n > m:
- a = b
- b = a
- n = m
- m = n
-
- current = range(n + 1)
- for i in range(1, m + 1):
- previous = current
- current = [
- i] + [
- 0] * m
- for j in range(1, n + 1):
- add = previous[j] + 1
- delete = current[j - 1] + 1
- change = previous[j - 1]
- if a[j - 1] != b[i - 1]:
- change = change + 1
-
- current[j] = min(add, delete, change)
-
-
- return current[n]
-
- number_pat = re.compile('.*?(\\d+)', re.IGNORECASE)
- STRIP_STRINGS2 = [
- 'foomatic:',
- 'hp-',
- 'hp_',
- 'hp ',
- '.gz',
- '.ppd',
- 'drv:',
- '-pcl',
- '-pcl3',
- '-jetready',
- '-zxs',
- '-zjs',
- '-ps',
- '-postscript',
- '-jr',
- '-lidl',
- '-lidil',
- '-ldl',
- '-hpijs']
- for p in models.TECH_CLASS_PDLS.values():
- pp = '-%s' % p
- if pp not in STRIP_STRINGS2:
- STRIP_STRINGS2.append(pp)
- continue
-
- STRIP_STRINGS = STRIP_STRINGS2[:]
- STRIP_STRINGS.extend([
- '-series',
- ' series',
- '_series'])
-
- def stripModel2(model):
- model = model.lower()
- for x in STRIP_STRINGS2:
- model = model.replace(x, '')
-
- return model
-
-
- def stripModel(model):
- model = model.lower()
- for x in STRIP_STRINGS:
- model = model.replace(x, '')
-
- return model
-
-
- def getPPDFile(stripped_model, ppds):
- '''
- Match up a model name to a PPD from a list of system PPD files.
- '''
- log.debug('1st stage edit distance match')
- mins = { }
- eds = { }
- min_edit_distance = sys.maxint
- log.debug('Determining edit distance from %s (only showing edit distances < 4)...' % stripped_model)
- for f in ppds:
- t = stripModel(os.path.basename(f))
- eds[f] = levenshtein_distance(stripped_model, t)
- if eds[f] < 4:
- log.debug("dist('%s') = %d" % (t, eds[f]))
-
- min_edit_distance = min(min_edit_distance, eds[f])
-
- log.debug('Min. dist = %d' % min_edit_distance)
- for f in ppds:
- if eds[f] == min_edit_distance:
- for m in mins:
- if os.path.basename(m) == os.path.basename(f):
- break
- continue
- else:
- mins[f] = ppds[f]
-
- log.debug(mins)
- if len(mins) > 1:
- log.debug('2nd stage matching with model number')
-
- try:
- model_number = number_pat.match(stripped_model).group(1)
- model_number = int(model_number)
- except AttributeError:
- pass
- except ValueError:
- pass
-
- log.debug('model_number=%d' % model_number)
- matches = { }
- for x in range(3):
- factor = 10 ** x
- log.debug('Factor = %d' % factor)
- adj_model_number = int(model_number / factor) * factor
- (number_matching, match) = (0, '')
- for m in mins:
-
- try:
- mins_model_number = number_pat.match(os.path.basename(m)).group(1)
- mins_model_number = int(mins_model_number)
- log.debug('mins_model_number= %d' % mins_model_number)
- except AttributeError:
- continue
- except ValueError:
- continue
-
- mins_adj_model_number = int(mins_model_number / factor) * factor
- log.debug('mins_adj_model_number=%d' % mins_adj_model_number)
- log.debug('adj_model_number=%d' % adj_model_number)
- if mins_adj_model_number == adj_model_number:
- log.debug('match')
- number_matching += 1
- matches[m] = ppds[m]
- log.debug(matches)
-
- log.debug('***')
-
- if len(matches):
- mins = matches
- break
- continue
-
-
- return mins
-
-
- def getPPDFile2(stripped_model, ppds):
- log.debug('Matching PPD list to model %s...' % stripped_model)
- matches = []
- for f in ppds:
- match = ppd_pat.match(f)
- if match is not None:
- if match.group(1) == stripped_model:
- log.debug('Found match: %s' % f)
-
- try:
- pdls = match.group(2).split('-')
- except AttributeError:
- pdls = []
-
- None if not prop.hpcups_build or 'hpijs' not in f else 'hpijs' not in pdls
- continue
-
- log.debug(matches)
- num_matches = len(matches)
- if num_matches == 0:
- log.error('No PPD found for model %s using new algorithm. Trying old algorithm...' % stripped_model)
- matches2 = getPPDFile(stripModel(stripped_model), ppds).items()
- log.debug(matches2)
- num_matches2 = len(matches2)
- if num_matches2:
- for f, d in matches2:
- match = ppd_pat.match(f)
- if match is not None:
- log.debug('Found match: %s' % f)
-
- try:
- pdls = match.group(2).split('-')
- except AttributeError:
- pdls = []
-
- if prop.hpcups_build or 'hpijs' not in f:
- pass
- None if (prop.hpijs_build or 'hpijs' in pdls or prop.hpcups_build) and 'hpijs' not in pdls else 'hpijs' not in pdls
- continue
-
-
- log.debug(matches)
- num_matches = len(matches)
-
- if num_matches == 0:
- log.error('No PPD found for model %s using old algorithm.' % stripModel(stripped_model))
- return None
- if num_matches == 1:
- log.debug('One match found.')
- return (matches[0][0], '')
- log.debug('%d matches found. Selecting based on PDL: Host > PS > PCL/Other' % num_matches)
- for p in [
- models.PDL_TYPE_HOST,
- models.PDL_TYPE_PS,
- models.PDL_TYPE_PCL]:
- for f, pdl_list in matches:
- for x in pdl_list:
- if models.PDL_TYPES.get(x, models.PDL_TYPE_HOST) == p:
- log.debug("Selecting '-%s' PPD: %s" % (x, f))
- return (f, '')
-
-
-
- log.debug('No specific PDL located. Defaulting to first found PPD file.')
- return (matches[0][0], '')
-
-
- def getErrorLogLevel():
- cups_conf = '/etc/cups/cupsd.conf'
-
- try:
- f = file(cups_conf, 'r')
- except OSError:
- log.error('%s not found.' % cups_conf)
- except IOError:
- log.error('%s: I/O error.' % cups_conf)
-
- for l in f:
- m = pat_cups_error_log.match(l)
- if m is not None:
- level = m.group(1).lower()
- log.debug('CUPS error_log LogLevel: %s' % level)
- return level
-
- log.debug('CUPS error_log LogLevel: unknown')
- return 'unknown'
-
-
- def getPrintJobErrorLog(job_id, max_lines = 1000, cont_interval = 5):
- ret = []
- s = '[Job %d]' % job_id
- cups_conf = '/var/log/cups/error_log'
-
- try:
- f = file(cups_conf, 'r')
- except (IOError, OSError):
- log.error('Could not open the CUPS error_log file: %s' % cups_conf)
- return ''
-
- if s in file(cups_conf, 'r').read():
- queue = utils.Queue()
- job_found = False
- while True:
- line = f.readline()
- if s in line:
- job_found = True
- while len(queue):
- ret.append(queue.get())
- ret.append(line.strip())
- if len(ret) > max_lines:
- break
-
- len(ret) > max_lines
- if job_found:
- queue.put(line.strip())
- if len(queue) > cont_interval:
- break
-
- len(queue) > cont_interval
-
- return '\n'.join(ret)
-
-
- def getDefaultPrinter():
- r = cupsext.getDefaultPrinter()
- if r is None:
- log.debug('The CUPS default printer is not set.')
-
- return r
-
-
- def setDefaultPrinter(printer_name):
- setPasswordPrompt('You do not have permission to set the default printer.')
- return cupsext.setDefaultPrinter(printer_name)
-
-
- def accept(printer_name):
- setPasswordPrompt('You do not have permission to accept jobs on a printer queue.')
- return controlPrinter(printer_name, CUPS_ACCEPT_JOBS)
-
-
- def reject(printer_name):
- setPasswordPrompt('You do not have permission to reject jobs on a printer queue.')
- return controlPrinter(printer_name, CUPS_REJECT_JOBS)
-
-
- def start(printer_name):
- setPasswordPrompt('You do not have permission to start a printer queue.')
- return controlPrinter(printer_name, IPP_RESUME_PRINTER)
-
-
- def stop(printer_name):
- setPasswordPrompt('You do not have permission to stop a printer queue.')
- return controlPrinter(printer_name, IPP_PAUSE_PRINTER)
-
-
- def purge(printer_name):
- setPasswordPrompt('You do not have permission to purge jobs.')
- return controlPrinter(printer_name, IPP_PURGE_JOBS)
-
-
- def controlPrinter(printer_name, cups_op):
- if cups_op in (CUPS_ACCEPT_JOBS, CUPS_REJECT_JOBS, IPP_PAUSE_PRINTER, IPP_RESUME_PRINTER, IPP_PURGE_JOBS):
- return cupsext.controlPrinter(printer_name, cups_op)
- return 0
-
-
- def openPPD(printer):
- if not printer:
- return None
- return cupsext.openPPD(printer)
-
-
- def closePPD():
- return cupsext.closePPD()
-
-
- def getPPD(printer):
- if not printer:
- return None
- return cupsext.getPPD(printer)
-
-
- def getPPDOption(option):
- return cupsext.getPPDOption(option)
-
-
- def getPPDPageSize():
- return cupsext.getPPDPageSize()
-
-
- def getPrinters():
- return cupsext.getPrinters()
-
-
- def getJobs(my_job = 0, completed = 0):
- return cupsext.getJobs(my_job, completed)
-
-
- def getAllJobs(my_job = 0):
- return cupsext.getJobs(my_job, 0) + cupsext.getJobs(my_job, 1)
-
-
- def getVersion():
- return cupsext.getVersion()
-
-
- def getVersionTuple():
- return cupsext.getVersionTuple()
-
-
- def getServer():
- return cupsext.getServer()
-
-
- def cancelJob(jobid, dest = None):
- setPasswordPrompt('You do not have permission to cancel a job.')
- if dest is not None:
- return cupsext.cancelJob(dest, jobid)
- jobs = cupsext.getJobs(0, 0)
- for j in jobs:
- if j.id == jobid:
- return cupsext.cancelJob(j.dest, jobid)
-
- return False
-
-
- def resetOptions():
- return cupsext.resetOptions()
-
-
- def addOption(option):
- return cupsext.addOption(option)
-
-
- def getOptions():
- return cupsext.getOptions()
-
-
- def printFile(printer, filename, title):
- if os.path.exists(filename):
- return cupsext.printFileWithOptions(printer, filename, title)
- return -1
-
-
- def addPrinter(printer_name, device_uri, location, ppd_file, model, info):
- log.debug("addPrinter('%s', '%s', '%s', '%s', '%s', '%s')" % (printer_name, device_uri, location, ppd_file, model, info))
- if ppd_file and not os.path.exists(ppd_file):
- log.error("PPD file '%s' not found." % ppd_file)
- return (-1, 'PPD file not found')
- return cupsext.addPrinter(printer_name, device_uri, location, ppd_file, model, info)
-
-
- def delPrinter(printer_name):
- setPasswordPrompt('You do not have permission to delete a printer.')
- return cupsext.delPrinter(printer_name)
-
-
- def getGroupList():
- return cupsext.getGroupList()
-
-
- def getGroup(group):
- return cupsext.getGroup(group)
-
-
- def getOptionList(group):
- return cupsext.getOptionList(group)
-
-
- def getOption(group, option):
- return cupsext.getOption(group, option)
-
-
- def getChoiceList(group, option):
- return cupsext.getChoiceList(group, option)
-
-
- def getChoice(group, option, choice):
- return cupsext.getChoice(group, option, choice)
-
-
- def setOptions():
- return cupsext.setOptions()
-
-
- def removeOption(option):
- return cupsext.removeOption(option)
-
-
- def setPasswordCallback(func):
- return cupsext.setPasswordCallback(func)
-
-
- def setPasswordPrompt(prompt):
- return cupsext.setPasswordPrompt(prompt)
-
-